package cn.kmia.hrm.util;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.nutz.http.Http;
import org.nutz.ioc.Ioc;
import org.nutz.ioc.impl.PropertiesProxy;
import org.nutz.log.Log;
import org.nutz.log.Logs;
import org.nutz.mvc.Mvcs;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;

import java.util.HashMap;
import java.util.Map;

/**
 * @program: hrm
 * @description: 与统一登录系统交互服务类
 * @author: 4K
 * @create: 2018-08-14 16:47
 **/
public class SSOUtil {

    private static final Log log = Logs.get();

    // SSOURL_GetToken
    public static String SSOURL_GetToken;

    // 项目code
    public static String CODE;

    // 项目secret
    public static String SECRET;

    // 获取资源需要的令牌
    public static String Access_Token;

    // SSOURL_GetOrgs
    public static String SSOURL_GetOrgs;

    // SSO 组织机构信息
    public static JSONArray SSO_Orgs;


    /**
     * 获取SSO的组织机构
     *
     * @return JSONObject
     */
    @At("/getSSO_Orgs")
    @Ok("json:full")
    public static JSONArray getSSO_Orgs() {
        return SSO_Orgs;
    }

    /**
     * 刷新SSO的token
     *
     * @return
     */
    public static void setAccess_Token() {
        // 读取配置信息
        Ioc ioc = Mvcs.getIoc();
        PropertiesProxy conf = ioc.get(PropertiesProxy.class, "conf"); // 获取读取配置文件类，静态方法不能注入
        SSOURL_GetToken = conf.get("SSOURL_GetToken");
        CODE = conf.get("CODE");
        SECRET = conf.get("SECRET");
        // 请求参数
        Map<String, Object> parms = new HashMap<>();
        parms.put("code", CODE);
        parms.put("secret", SECRET);
        String response = Http.post(SSOURL_GetToken,
                parms, // 设置请求参数
                5 * 1000); // 设置超时时间
        if (response != null) {
            JSONObject jsonObject = JSONObject.parseObject(response);
            if (jsonObject != null && jsonObject.getBoolean("success")) {
                Access_Token = jsonObject.getString("data");
            }
        }
    }

    /**
     * 刷新SSO的组织机构
     *
     * @return JSONObject
     */
    @At("/setSSO_Orgs")
    @Ok("json:full")
    @RequiresPermissions("sso:setOrgs")
    public static void setSSO_Orgs() {
        // 读取配置信息
        Ioc ioc = Mvcs.getIoc();
        PropertiesProxy conf = ioc.get(PropertiesProxy.class, "conf"); // 获取读取配置文件类，静态方法不能注入
        SSOURL_GetOrgs = conf.get("SSOURL_GetOrgs");
        try {
            // 请求参数
            Map<String, Object> parms = new HashMap<>();
            parms.put("access_token", Access_Token);
            parms.put("pId", 2); // 根级组织机构id 2 为昆明机场
            parms.put("pLevel", 3);// 获取组织机构级别 3 为二级机构
            String response = Http.post(SSOURL_GetOrgs,
                    parms, // 设置请求参数
                    5 * 1000); // 设置超时时间
            if (response != null) {
                JSONObject jsonObject = JSONObject.parseObject(response);
                if (jsonObject != null && jsonObject.getBoolean("success")) {
                    JSONArray jsonArray = jsonObject.getJSONArray("data");
                    SSO_Orgs = jsonArray.getJSONObject(0).getJSONArray("children");
                } else if (jsonObject != null && !jsonObject.getBoolean("success")) {
                    String msg = jsonObject.getString("msg");
                    // 如果是token过期 重新生成 重新请求
                    if ("".equals(msg)) {
                        setAccess_Token();
                        parms.put("access_token", Access_Token);
                        response = Http.post(SSOURL_GetOrgs,
                                parms, // 设置请求参数
                                5 * 1000); // 设置超时时间
                        if (response != null) {
                            jsonObject = JSONObject.parseObject(response);
                            if (jsonObject != null && jsonObject.getBoolean("success")) {
                                SSO_Orgs = jsonObject.getJSONObject("data").getJSONArray("children");
                            }
                        }
                    }
                }
                if (SSO_Orgs != null) {
                    JSONArray filterOrgs = new JSONArray();
                    JSONObject org;
                    for (int i = 0; i < SSO_Orgs.size(); i++) {
                        org = SSO_Orgs.getJSONObject(i);
                        if ("集团值班经理室".equals(org.getString("label")) ||"后台用户".equals(org.getString("label")) || "航空安全护卫部（机场综合监察支队）".equals(org.getString("label")) || "机场综合监察支队".equals(org.getString("label")) || "内退".equals(org.getString("label"))) {
                            continue;
                        }
                        filterOrgs.add(org);
                    }
                    SSO_Orgs = filterOrgs;
                }
            }
        } catch (Exception e) {
            log.error("获取SSO组织机构信息出错：", e);
        }
    }

}
